package com.concurrency.example.proxy.sdkDemo;

import com.concurrency.example.proxy.SellTickets;
import com.concurrency.example.proxy.TrainStation;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory {
    TrainStation trainStation = new TrainStation();

    // 获取代理对象方法
    public SellTickets getSellTickets() {
        /**
         * 使用Proxy获取代理对象
         * newProxyInstance()方法参数说明：
         *                 ClassLoader loader ： 类加载器，用于加载代理类，使用真实对象的类加载器即可
         *                 Class<?>[] interfaces ： 真实对象所实现的接口，代理模式真实对象和代理对象实现相同的接口
         *                 InvocationHandler h ： 代理对象的调用处理程序
         */
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                trainStation.getClass().getClassLoader(),
                trainStation.getClass().getInterfaces(),
                (proxy, method, args) -> {
                    System.out.println("火车票代售点收取一些服务费");
                    method.invoke(trainStation, args);
                    return null;
                });

        return sellTickets;
    }
}
